﻿using System;
using Acaweb.Data.Contracts;
using Acaweb.Model.Entities;
using Acaweb.Componentes.Contracts;
using System.Collections.Generic;
using System.Linq;
using Acaweb.Model.Entities.DatosCompuestos;


namespace Acaweb.Componentes
{
    public class EstudiantesService : BaseService, IEstudiantesService
    {
        private IEstudiantesDao _EstudianteDao;
        private IHistorialEstudiantesDao _HistorialEstudiantesDao;
        private IEncuestasDao _EncuestasDao;
        private IReporteDao _ReporteDao;
        private ICursosMatriculadosDao _CursosMatriculadosDao;
        private IHistorialLaboralDao _HistorialLaboralDao;
        private IHistorialAcademicoDao _HistorialAcademicoDao;
        private IHijosDao _HijosDao;
        private IManejoIdiomasDao _ManejoIdiomasDao;

        public IManejoIdiomasDao ManejoIdiomasDao
        {
            get { return _ManejoIdiomasDao; }
            set { _ManejoIdiomasDao = value; }
        }

        public IHijosDao HijosDao
        {
            get { return _HijosDao; }
            set { _HijosDao = value; }
        }

        public IHistorialAcademicoDao HistorialAcademicoDao
        {
            get { return _HistorialAcademicoDao; }
            set { _HistorialAcademicoDao = value; }
        }

        public IHistorialLaboralDao HistorialLaboralDao
        {
            get { return _HistorialLaboralDao; }
            set { _HistorialLaboralDao = value; }
        }

        public ICursosMatriculadosDao CursosMatriculadosDao
        {
            get { return _CursosMatriculadosDao; }
            set { _CursosMatriculadosDao = value; }
        }

        public IReporteDao ReporteDao
        {
            get { return _ReporteDao; }
            set { _ReporteDao = value; }
        }

        public IEncuestasDao EncuestasDao
        {
            get { return _EncuestasDao; }
            set { _EncuestasDao = value; }
        }

        public IHistorialEstudiantesDao HistorialEstudiantesDao
        {
            get { return _HistorialEstudiantesDao; }
            set { _HistorialEstudiantesDao = value; }
        }

        public IEstudiantesDao EstudianteDao
        {
            get { return _EstudianteDao; }
            set { _EstudianteDao = value; }
        }

        public IList<Estudiantes> GetAll()
        {
            return EstudianteDao.GetAll();
        }

        public Estudiantes GetById(int Id)
        {
            Estudiantes Estudiante = EstudianteDao.GetById(Id);

            Estudiante.HistorialLaboral = HistorialLaboralDao.GetByAsociado(Estudiante.CodigoInterno).ToList();
            Estudiante.HistorialAcademico = HistorialAcademicoDao.GetByAsociado(Estudiante.CodigoInterno).ToList();
            Estudiante.Hijos = HijosDao.GetByCodigoIntermno(Estudiante.CodigoInterno).ToList();
            Estudiante.ManejoIdiomas = ManejoIdiomasDao.GetAll().Where(t => t.ManejoIdiomasPk.CodigoInterno == Estudiante.CodigoInterno).ToList();//Corregir

            return Estudiante;
        }

        public IList<Estudiantes> GetByMunicipio(int Municipio)
        {
            return EstudianteDao.GetByMunicipio(Municipio);
        }

        public IList<Estudiantes> GetByCurso(CursoPk Curso)
        {
            List<CursosMatriculados> ListaCursosMatriculados = CursosMatriculadosDao.GetByCurso(Curso).ToList();
            List<Estudiantes> ListaEstudiantes = new List<Estudiantes>();

            ListaCursosMatriculados.ForEach(t => ListaEstudiantes.Add(GetByCodigoEstudiante(t.CursoMatriculadoPk.CodigoEstudiante)));

            return ListaEstudiantes.OrderBy(t => t.Apellidos).ToList();
        }

        public IList<Estudiantes> GetByPlanesEstudios(int PlanEstudio)
        {
            return EstudianteDao.GetByPlanesEstudios(PlanEstudio);
        }

        public Estudiantes GetByCodigoEstudiante(int CodigoEstudiante)
        {
            Estudiantes Estudiante = EstudianteDao.GetByCodigoEstudiante(CodigoEstudiante);

            Estudiante.HistorialLaboral = HistorialLaboralDao.GetByAsociado(Estudiante.CodigoInterno).ToList();
            Estudiante.HistorialAcademico = HistorialAcademicoDao.GetByAsociado(Estudiante.CodigoInterno).ToList();
            Estudiante.Hijos = HijosDao.GetByCodigoIntermno(Estudiante.CodigoInterno).ToList();
            Estudiante.ManejoIdiomas = ManejoIdiomasDao.GetAll().Where(t => t.ManejoIdiomasPk.CodigoInterno == Estudiante.CodigoInterno).ToList();//Corregir

            return Estudiante;
        }


        public PeriodoAcademico GetLastPeriodoAcademico(int CodigoEstudiante)
        {
            return this.GetPrivateLastPeriodoAcademico(CodigoEstudiante);
        }

        public void Create(Estudiantes Estudiante, Encuestas Encuesta)
        {
            Estudiante.CodigoEstudiante = EstudianteDao.LastIndex();
            EstudianteDao.Save(Estudiante);
            if (Encuesta != null)
                EncuestasDao.Save(Encuesta);
        }

        public string GenerarVolantePago(int CodigoEstudiante)
        {
            TipoPrograma miTipoPrograma = EstudianteDao.GetByCodigoEstudiante(CodigoEstudiante).PlanEstudio.TipoPrograma;

            TipoDocumentoVolante TipoDocumento = TipoDocumentoVolante.FEC;

            switch (miTipoPrograma)
            {
                case TipoPrograma.PR:
                    TipoDocumento = TipoDocumentoVolante.FPR;
                    break;

                case TipoPrograma.PO:
                    TipoDocumento = TipoDocumentoVolante.FPO;
                    break;
            }

            PeriodoAcademico Periodo = GetPrivateLastPeriodoAcademico(CodigoEstudiante);

            return ReporteDao.GenerateVolantePago(TipoDocumento, CodigoEstudiante, Periodo);
        }

        public IList<Estudiantes> GetByEstadoEstudiante(EstadoEstudiante Estado, int skip, int limit)
        {
            return EstudianteDao.GetByEstadoEstudiante(Estado, skip, limit);
        }

        public void Update(Estudiantes Estudiante)
        {
            Estudiante.Actualizado = true;
            EstudianteDao._Update(Estudiante);
        }

        public IList<PeriodoAcademico> GetPeriodos(int CodigoEstudiante)
        {
            List<HistorialEstudiantes> Historial = HistorialEstudiantesDao.GetByEstudiante(CodigoEstudiante).ToList();

            List<PeriodoAcademico> Periodos = new List<PeriodoAcademico>();

            Historial.ForEach(t => Periodos.Add(t.HistorialEstudiantePk.PeriodoAcademico));

            return Periodos;
        }

        private PeriodoAcademico GetPrivateLastPeriodoAcademico(int CodigoEstudiante)
        {
            return HistorialEstudiantesDao.GetByEstudiante(CodigoEstudiante).Last().HistorialEstudiantePk.PeriodoAcademico;
        }

        public IList<Estudiantes> GetDocumentosIdentificacion(int DocumentoIdentificacion)
        {
            return EstudianteDao.GetByDocumentoIdentidad(DocumentoIdentificacion);
        }
    }
}